﻿using System;
using System.Collections.Generic;
using System.Linq;
using personalplaner.business.common;
using personalplaner.business.stamm;
using personalplaner.core.sql;

namespace personalplaner.dataprovider.services
{
	public partial class AnstellungDataService
	{
		#region Get Methods

		/// <summary>
		/// gets a list containing all <see cref="Anstellung"/>
		/// </summary>
		/// <param name="mandid"></param>
		/// <param name="addEmptyRow"></param>
		/// <returns>anstellungid,name,prioritaet,einsatzprotag,gerechnet </returns>
		public IEnumerable<Anstellung> GetAnstellungen(DatabaseSettings settings, string mandid, bool addEmptyRow = false)
		{
			Querry query = new Querry(settings, "get_anstellung");
			query.AddParameter("@mandid", mandid);

			var table = query.ExecuteForDataTable();

			if (table.Rows.Count == 0)
				return null;

			try
			{
				var lst = new List<Anstellung>(m_anstellungenData(table));

				if (addEmptyRow)
				{
					lst.Insert(0, new Anstellung());
				}

				return lst;
			}
			catch (Exception e)
			{
				throw new Exception("GetAnstellungen caused an error", e);
			}
		}

		public int GetAnstellungID(DatabaseSettings settings, int prsid)
		{
			try
			{
				var dv = SimpleQuerry.ExecuteForDataTable(settings, "select AnstellungID from PersonAnstellung where Von <= GETDATE() and Bis >= GETDATE() and PrsID = " + prsid);
				if (dv.Rows.Count > 0)
					return int.Parse(dv.Rows[0][0].ToString());
			}
			catch (Exception) { }

			return 0;
		}

		public Anstellung GetPersonAnstellung(DatabaseSettings settings, int prsid)
		{
			Querry query = new Querry(settings, "get_personanstellung");
			query.AddParameter("@prsid", prsid);

			var table = query.ExecuteForDataTable();

			if (table.Rows.Count == 0)
				return null;

			try
			{
				var lst = new List<Anstellung>(m_anstellungenData(table));

				return lst.First();
			}
			catch (Exception e)
			{
				throw new Exception("GetPersonAnstellung caused an error", e);
			}
		}

        public bool GetIsAnstellungUsed(DatabaseSettings settings, int anstellungid)
        {
            var dv = SimpleQuerry.ExecuteForDataTable(settings, string.Format("select 1 from PersonAnstellung where AnstellungID = {0}", anstellungid));
            if (dv.Rows.Count > 0)
                return true;

            return false;
        }

		#endregion

		#region Set Methods

		/// <summary>
		/// saves a new anstellung in the database
		/// </summary>
		/// <param name="settings"></param>
		/// <param name="mandid"></param>
		/// <param name="anstellung"></param>
		/// <returns></returns>
		public bool SetAnstellung(DatabaseSettings settings, string mandid, Anstellung anstellung)
		{
			var stp = new Querry(settings, "set_anstellung");

			stp.AddParameter("@mandid", mandid);
			stp.AddParameter("@anstellungname", anstellung.Name);
			stp.AddParameter("@kurztext", anstellung.Name);
			stp.AddParameter("@beschreibung", anstellung.Beschreibung);
			stp.AddParameter("@prio", anstellung.Prioritaet);
			stp.AddParameter("@EinsatzProTag", anstellung.EinsatzProTag);
			stp.AddParameter("@gerechnet", anstellung.IsGerechnet ? 1 : 0);
			stp.AddParameter("@ausgelernt", anstellung.IsAusgelernt ? 1 : 0);

			return stp.Execute(true);
		}

		public void SetPersonAnstellung(DatabaseSettings settings, int prsid, int anstellungid, DateTime von, DateTime bis)
		{
			var stp = new Querry(settings, "upd_prsanstellung");
			stp.AddParameter("@prsid", prsid);
			stp.AddParameter("@anstellungid", anstellungid);
			stp.AddParameter("@von", von.ToString("yyyyMMdd"));
			stp.AddParameter("@bis", bis.ToString("yyyyMMdd"));

			try
			{
				stp.Execute(true);
			}
			catch (Exception e)
			{
				throw new Exception("SetPersonAnstellung caused an error", e);
			}
		}

		#endregion

		#region Update Methods

		public bool UpdateAnstellung(DatabaseSettings settings, Anstellung anstellung)
		{
			var stp = new Querry(settings, "upd_anstellung");
			// TODO: NICHT MIT BESCHRID SONDERN MIT EIGENER ID

			stp.AddParameter("@anstellungid", anstellung.AnstellungID);
			stp.AddParameter("@anstellungname", anstellung.Name);
			stp.AddParameter("@beschreibung", anstellung.Beschreibung);
			stp.AddParameter("@prio", anstellung.Prioritaet);
			stp.AddParameter("@EinsatzProTag", anstellung.EinsatzProTag);
			stp.AddParameter("@gerechnet", anstellung.IsGerechnet ? 1 : 0);
			stp.AddParameter("@ausgelernt", anstellung.IsAusgelernt ? 1 : 0);

			return stp.Execute(true);
		}

		#endregion

        #region Delete Methods

        public bool DeleteAnstellung(DatabaseSettings settings, int anstellungid)
        {
            if (!GetIsAnstellungUsed(settings, anstellungid))
			{
				var stp = new Querry(settings, "del_anstellung");
                stp.AddParameter("@anstellungid", anstellungid);

				return stp.Execute(true);
			}

			return false;
        }

        #endregion

        //public static string GetName(int anstellungid)
		//{
		//    DataView dv = SimpleQuerry.ExecuteForDataView("select Name from Anstellung where AnstellungID = " + anstellungid);

		//    if (dv != null && dv.Count > 0)
		//        return dv[0].Row[0].ToString();

		//    return string.Empty;
		//}

		//public static string GetLangtext(int anstellungid)
		//{
		//    DataView dv = SimpleQuerry.ExecuteForDataView("select Langtext from Anstellung a inner join Beschreibung b on a.BeschrID = b.BeschrID where AnstellungID = " + anstellungid);

		//    if (dv != null && dv.Count > 0)
		//        return dv[0].Row[0].ToString();

		//    return string.Empty;
		//}


		//public static int GetPrioritaet(int anstellungid)
		//{
		//    DataView dv = SimpleQuerry.ExecuteForDataView("select Prioritaet from Anstellung where AnstellungID = " + anstellungid);

		//    if (dv != null && dv.Count > 0)
		//        return int.Parse(dv[0].Row[0].ToString());

		//    return 0;
		//}

		//public static int GetEinsatzProTag(int anstellungid)
		//{
		//    DataView dv = SimpleQuerry.ExecuteForDataView("select EinsatzProTag from Anstellung where AnstellungID = " + anstellungid);

		//    if (dv != null && dv.Count > 0)
		//        return int.Parse(dv[0].Row[0].ToString());

		//    return 0;
		//}

		//public static bool GetGerechnet(int anstellungid)
		//{
		//    DataView dv = SimpleQuerry.ExecuteForDataView("select Gerechnet from Anstellung where AnstellungID = " + anstellungid);

		//    if (dv != null && dv.Count > 0)
		//    {
		//        if (int.Parse(dv[0].Row[0].ToString()) == 1)
		//            return true;
		//    }

		//    return false;
		//}

		//public static bool CheckIfNameExists(string name)
		//{
		//    DataView dv = SimpleQuerry.ExecuteForDataView("select * from Anstellungen where Name = " + name);
		//    if (dv != null && dv.Count > 0)
		//        return true;

		//    return false;
		//}

		//public static void SaveNewAnstellung(string name, string beschreibung, int prioritaet, int anzahleinsatze, bool imsaldorechnen, string mandid, bool ausgelernt)
		//{
		//    int rechnen = 0;
		//    if (imsaldorechnen)
		//        rechnen = 1;

		//    var stp = new Querry();

		//    stp.SetSTPName("set_anstellung");

		//    stp.AddParameter("@mandid", mandid);
		//    stp.AddParameter("@anstellungname", name);
		//    stp.AddParameter("@kurztext", name);
		//    stp.AddParameter("@beschreibung", beschreibung);
		//    stp.AddParameter("@prio", prioritaet);
		//    stp.AddParameter("@EinsatzProTag", anzahleinsatze);
		//    stp.AddParameter("@gerechnet", rechnen);
		//    if (ausgelernt)
		//        stp.AddParameter("@ausgelernt", 1);
		//    else
		//        stp.AddParameter("@ausgelernt", 0);

		//    stp.Execute(true);
		//}

		//public static void UpdateAnstellung(int anstellungid, string name, string beschreibung, int prioritaet, int anzahleinsatze, bool imsaldorechnen, bool ausgelernt)
		//{
		//    int rechnen = 0;
		//    if (imsaldorechnen)
		//        rechnen = 1;

		//    Querry stp = new Querry();
		//    // TODO: NICHT MIT BESCHRID SONDERN MIT EIGENER ID
		//    stp.SetSTPName("upd_anstellung");

		//    stp.AddParameter("@anstellungid", anstellungid);
		//    stp.AddParameter("@anstellungname", name);
		//    stp.AddParameter("@beschreibung", beschreibung);
		//    stp.AddParameter("@prio", prioritaet);
		//    stp.AddParameter("@EinsatzProTag", anzahleinsatze);
		//    stp.AddParameter("@gerechnet", rechnen);
		//    if (ausgelernt)
		//        stp.AddParameter("@ausgelernt", 1);
		//    else
		//        stp.AddParameter("@ausgelernt", 0);

		//    stp.Execute(true);
		//}

		///// <summary>
		///// Fills the given Combobox with all Anstellungen
		///// </summary>
		///// <param name="combo">Reference of the Combobox to be filled</param>
		///// <returns>The DataView of the Combobox</returns>
		//public static DataView GetAnstellungenNamen(string mandid)
		//{
		//    DataView dv = SimpleQuerry.ExecuteForDataView("select AnstellungID, Name from Anstellung where mandid = '" + mandid + "' order by Prioritaet");

		//    if (dv != null && dv.Count > 0)
		//        return dv;

		//    return new DataView();
		//}



        
    }
}
